home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / basic / gbnckon8 / test.lst < prev   
File List  |  1995-11-25  |  6KB  |  264 lines

  1. REM Originalname: <3DGRAFIK.LST>
  2. ' **************************
  3. ' * Routinen zur 3D Grafik *
  4. ' **************************
  5. '
  6. DIM x(1000),y(1000),z(1000)
  7. DIM xx%(1000),yy%(1000)
  8. DIM x_monitor%(1000),y_monitor%(1000),pkt_entf(1000)
  9. DIM start%(200),anz%(200),farbe%(200),entfernung(200)
  10. '
  11. DIM w(20)
  12. DATA 10,40,30,20
  13. DATA 15,50,12,60
  14. DATA 30,20,20,40
  15. FOR n%=1 TO 9
  16.   READ w(n%)
  17. NEXT n%
  18. '
  19. @def_quader(50,-5,0,35,w(7),2)
  20. @def_quader(50,-5,w(7),35,w(8),4)
  21. @def_quader(50,-5,w(7)+w(8),35,w(9),6)
  22. @def_quader(50,50,0,35,w(1),2)
  23. @def_quader(50,50,w(1),35,w(2),4)
  24. @def_quader(50,50,w(1)+w(2),35,w(3),6)
  25. @def_quader(50,110,0,35,w(4),2)
  26. @def_quader(50,110,w(4),35,w(5),4)
  27. @def_quader(50,110,w(4)+w(5),35,w(6),6)
  28. @def_quader(50,180,0,35,w(7),2)
  29. @def_quader(50,180,w(7),35,w(8),4)
  30. @def_quader(50,180,w(7)+w(8),35,w(9),6)
  31. '
  32. ' @Def_torte(0,0,0,150,50,0,50,1)
  33. ' @Def_torte(30,0,0,150,50,50,120,2)
  34. ' @Def_torte(0,0,0,150,50,120,220,3)
  35. ' @Def_torte(0,0,0,150,50,220,250,4)
  36. ' @Def_torte(0,0,0,150,50,250,300,5)
  37. ' @Def_torte(0,0,0,150,50,300,360,6)
  38. '
  39. @zeige_grafik(10000,30)
  40. DO
  41.   EXIT IF MOUSEK
  42. LOOP
  43. END
  44. '
  45. PROCEDURE def_quader(x%,y%,z%,breite%,hoehe%,farbe%)
  46.   INC fl%
  47.   start%(fl%)=pkt%+1
  48.   anz%(fl%)=4
  49.   farbe%(fl%)=farbe%+1
  50.   '
  51.   INC pkt%
  52.   x(pkt%)=x%
  53.   y(pkt%)=y%
  54.   z(pkt%)=z%+hoehe%
  55.   INC pkt%
  56.   x(pkt%)=x%+breite%
  57.   y(pkt%)=y%
  58.   z(pkt%)=z%+hoehe%
  59.   INC pkt%
  60.   x(pkt%)=x%+breite%
  61.   y(pkt%)=y%+breite%
  62.   z(pkt%)=z%+hoehe%
  63.   INC pkt%
  64.   x(pkt%)=x%
  65.   y(pkt%)=y%+breite%
  66.   z(pkt%)=z%+hoehe%
  67.   ' ----- links und rechts
  68.   FOR i%=x% TO x%+breite% STEP breite%
  69.     INC fl%
  70.     start%(fl%)=pkt%+1
  71.     anz%(fl%)=4
  72.     farbe%(fl%)=farbe%
  73.     '
  74.     INC pkt%
  75.     x(pkt%)=i%
  76.     y(pkt%)=y%
  77.     z(pkt%)=z%
  78.     INC pkt%
  79.     x(pkt%)=i%
  80.     y(pkt%)=y%+breite%
  81.     z(pkt%)=z%
  82.     INC pkt%
  83.     x(pkt%)=i%
  84.     y(pkt%)=y%+breite%
  85.     z(pkt%)=z%+hoehe%
  86.     INC pkt%
  87.     x(pkt%)=i%
  88.     y(pkt%)=y%
  89.     z(pkt%)=z%+hoehe%
  90.   NEXT i%
  91.   ' ----- vorne und hinten
  92.   FOR i%=y% TO y%+breite% STEP breite%
  93.     INC fl%
  94.     start%(fl%)=pkt%+1
  95.     anz%(fl%)=4
  96.     farbe%(fl%)=farbe%+2
  97.     '
  98.     INC pkt%
  99.     x(pkt%)=x%
  100.     y(pkt%)=i%
  101.     z(pkt%)=z%
  102.     INC pkt%
  103.     x(pkt%)=x%+breite%
  104.     y(pkt%)=i%
  105.     z(pkt%)=z%
  106.     INC pkt%
  107.     x(pkt%)=x%+breite%
  108.     y(pkt%)=i%
  109.     z(pkt%)=z%+hoehe%
  110.     INC pkt%
  111.     x(pkt%)=x%
  112.     y(pkt%)=i%
  113.     z(pkt%)=z%+hoehe%
  114.   NEXT i%
  115. RETURN
  116. '
  117. PROCEDURE def_torte(x%,y%,z%,radius%,hoehe%,anf_winkel%,end_winkel%,farbe%)
  118.   INC fl%
  119.   start%(fl%)=pkt%+1
  120.   start_%=start%(fl%)
  121.   '
  122.   INC pkt%
  123.   x(pkt%)=x%
  124.   y(pkt%)=y%
  125.   z(pkt%)=z%+hoehe%
  126.   '
  127.   alpha%=anf_winkel%
  128.   REPEAT
  129.     INC pkt%
  130.     x(pkt%)=x%+SIN(alpha%/180*PI)*radius%
  131.     y(pkt%)=y%+COS(alpha%/180*PI)*radius%
  132.     z(pkt%)=z%+hoehe%
  133.     alpha%=(INT(alpha%/10)+1)*10
  134.   UNTIL alpha%>=end_winkel%
  135.   alpha%=end_winkel%
  136.   INC pkt%
  137.   x(pkt%)=x%+SIN(alpha%/180*PI)*radius%
  138.   y(pkt%)=y%+COS(alpha%/180*PI)*radius%
  139.   z(pkt%)=z%+hoehe%
  140.   '
  141.   anz%(fl%)=pkt%-start%(fl%)+1
  142.   anz_%=anz%(fl%)
  143.   farbe%(fl%)=farbe%
  144.   FOR i%=start_% TO start_%+anz_%-1
  145.     INC fl%
  146.     start%(fl%)=pkt%+1
  147.     anz%(fl%)=4
  148.     farbe%(fl%)=farbe%+1
  149.     '
  150.     INC pkt%
  151.     x(pkt%)=x(i%)
  152.     y(pkt%)=y(i%)
  153.     z(pkt%)=z%
  154.     '
  155.     INC pkt%
  156.     x(pkt%)=x(i%)
  157.     y(pkt%)=y(i%)
  158.     z(pkt%)=z%+hoehe%
  159.     '
  160.     IF i%=start_%+anz_%-1
  161.       INC pkt%
  162.       x(pkt%)=x(start_%)
  163.       y(pkt%)=y(start_%)
  164.       z(pkt%)=z%+hoehe%
  165.       '
  166.       INC pkt%
  167.       x(pkt%)=x(start_%)
  168.       y(pkt%)=y(start_%)
  169.       z(pkt%)=z%
  170.     ELSE
  171.       INC pkt%
  172.       x(pkt%)=x(i%+1)
  173.       y(pkt%)=y(i%+1)
  174.       z(pkt%)=z%+hoehe%
  175.       '
  176.       INC pkt%
  177.       x(pkt%)=x(i%+1)
  178.       y(pkt%)=y(i%+1)
  179.       z(pkt%)=z%
  180.     ENDIF
  181.     '
  182.   NEXT i%
  183. RETURN
  184. '
  185. PROCEDURE zeige_grafik(entfernung%,winkel%)
  186.   ' ##### Z-Achse drehen -> Drehung
  187.   cos_drehung=COS(150/180*PI)
  188.   sin_drehung=SIN(150/180*PI)
  189.   CLR i%
  190.   REPEAT
  191.     INC i%
  192.     x_=x(i%)
  193.     x(i%)=cos_drehung*x_-sin_drehung*y(i%)
  194.     y(i%)=cos_drehung*y(i%)+sin_drehung*x_
  195.   UNTIL i%=pkt%
  196.   ' ##### X-Achse drehen -> Winkel
  197.   cos_winkel=COS(winkel%/180*PI)
  198.   sin_winkel=SIN(winkel%/180*PI)
  199.   CLR i%
  200.   REPEAT
  201.     INC i%
  202.     y_=y(i%)
  203.     y(i%)=cos_winkel*y_-sin_winkel*z(i%)
  204.     z(i%)=cos_winkel*z(i%)+sin_winkel*y_
  205.   UNTIL i%=pkt%
  206.   ' ##### X_monitor, Y_monitor berechnen
  207.   CLR i%
  208.   REPEAT
  209.     INC i%
  210.     x_monitor%(i%)=(x(i%)*entfernung%)/(entfernung%+y(i%))+320
  211.     y_monitor%(i%)=-(z(i%)*entfernung%)/(entfernung%+y(i%))+200
  212.     pkt_entf(i%)=SQR(x(i%)^2+(entfernung%+y(i%))^2+z(i%)^2)
  213.   UNTIL i%=pkt%
  214.   ' ##### minimale Entfernung berechnen
  215.   CLR i%
  216.   REPEAT
  217.     INC i%
  218.     entfernung(i%)=10000000
  219.     FOR j%=start%(i%) TO start%(i%)+anz%(i%)-1
  220.       IF pkt_entf(j%)<entfernung(i%)
  221.         entfernung(i%)=pkt_entf(j%)
  222.       ENDIF
  223.     NEXT j%
  224.   UNTIL i%=fl%
  225.   CLR i%
  226.   REPEAT
  227.     INC i%
  228.     CLR summe
  229.     FOR j%=start%(i%) TO start%(i%)+anz%(i%)-1
  230.       ADD summe,pkt_entf(j%)
  231.     NEXT j%
  232.     ADD entfernung(i%),summe/anz%(i%)
  233.   UNTIL i%=fl%
  234.   ' ##### Sortieren nach Entfernung
  235.   FOR j%=fl% DOWNTO 1
  236.     min=10000000
  237.     FOR i%=1 TO j%
  238.       IF entfernung(i%)<min
  239.         min=entfernung(i%)
  240.         index%=i%
  241.       ENDIF
  242.     NEXT i%
  243.     '
  244.     SWAP start%(j%),start%(index%)
  245.     SWAP anz%(j%),anz%(index%)
  246.     SWAP farbe%(j%),farbe%(index%)
  247.     SWAP entfernung(j%),entfernung(index%)
  248.     '
  249.   NEXT j%
  250.   ' ##### Flächen von hinten nach vorne aufbauen
  251.   CLR i%
  252.   REPEAT
  253.     INC i%
  254.     CLR j%
  255.     REPEAT
  256.       xx%(j%)=x_monitor%(start%(i%)+j%)
  257.       yy%(j%)=y_monitor%(start%(i%)+j%)
  258.       INC j%
  259.     UNTIL j%=anz%(i%)
  260.     DEFFILL 1,2,farbe%(i%)
  261.     POLYFILL anz%(i%),xx%(),yy%()
  262.   UNTIL i%=fl%
  263. RETURN
  264.